/**
 * Copyright 2013-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *
 * @providesModule accumulate
 */

'use strict'

var invariant = require('fbjs/lib/invariant')

/**
 * Accumulates items that must not be null or undefined.
 *
 * This is used to conserve memory by avoiding array allocations.
 *
 * @return {*|array<*>} An accumulation of items.
 */
function accumulate(current, next) {
  !(next != null)
    ? process.env.NODE_ENV !== 'production'
      ? invariant(
          false,
          'accumulate(...): Accumulated items must be not be null or undefined.'
        )
      : invariant(false)
    : void 0
  if (current == null) {
    return next
  } else {
    // Both are not empty. Warning: Never call x.concat(y) when you are not
    // certain that x is an Array (x could be a string with concat method).
    var currentIsArray = Array.isArray(current)
    var nextIsArray = Array.isArray(next)
    if (currentIsArray) {
      return current.concat(next)
    } else {
      if (nextIsArray) {
        return [current].concat(next)
      } else {
        return [current, next]
      }
    }
  }
}

module.exports = accumulate
